home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 8 / Revista CD Expert nº 08 CD1.iso / Utilitarios / Programacao / Pacific C for DOS / INCLUDE / INTRPT.H < prev    next >
C/C++ Source or Header  |  1995-03-08  |  8KB  |  293 lines

  1. /* Definitions for interrupt handling */
  2.  
  3.  
  4. #if    defined(i8086) && !defined(FLAT_MODEL)
  5. typedef far interrupt void (*isr)(void);
  6. #else
  7. typedef interrupt void (*isr)(void);
  8. #endif
  9.  
  10. #define    _imkstr_(x)    #x
  11.  
  12. /*
  13.  *    ROM_VECTOR, RAM_VECTOR & CHANGE_VECTOR macros for 6805, 6809,
  14.  *    68HC11/6801/6301 and 680x0
  15.  *
  16.  *    ROM_VECTOR: points a ROM based vector directly at an interrupt
  17.  *            function.
  18.  *
  19.  *    RAM_VECTOR: points a ROM based vector at a JMP instruction in
  20.  *            the "data" psect which jumps to the interrupt function.
  21.  *            If "data" is linked into RAM, this results in a "soft"
  22.  *            vector which can be modified.
  23.  *
  24.  *    CHANGE_VECTOR:  changes the a JMP instruction defined by RAM_VECTOR to
  25.  *            point at a different interrupt function.
  26.  *
  27.  *    READ_RAM_VECTOR:    returns the address of the interrupt function
  28.  *                to which a RAM vector effectively points.
  29.  *
  30.  *    Colin Weaver, August 1992
  31.  */
  32.  
  33. /*
  34.  *    68HC11,6801,6301,6805    ei() and di()
  35.  */
  36.  
  37. #if    m6800 || m6805
  38. #define    ei()    asm("    cli")
  39. #define    di()    asm("    sei")
  40. #endif    /* m6800 */
  41.  
  42. /*
  43.  *    6805    ROM_VECTOR, RAM_VECTOR, CHANGE_VECTOR, READ_RAM_VECTOR
  44.  */
  45.  
  46. #if    m6805
  47. #define ROM_VECTOR(vec, fun) \
  48.         asm("    ifge    (" _imkstr_(vec) "!.$F)-$E"); \
  49.         asm("    fail    Can't modify reset vector"); \
  50.         asm("    endc"); \
  51.         asm("    psect    vectors,ovrld"); \
  52.         asm("    global    _" _imkstr_(fun)); \
  53.         asm("    org    " _imkstr_(vec) "!.$F"); \
  54.         asm("    fdb    _" _imkstr_(fun)); \
  55.         asm("    psect    text")
  56.  
  57. #define    INIT_BYTE(addr, value) \
  58.         asm("    psect    absdata,abs,ovrld"); \
  59.         asm("    org    " _imkstr_(addr)); \
  60.         asm("    fcb    " _imkstr_(value)); \
  61.         asm("    psect    text")
  62.  
  63. struct _RAM_VEC {
  64.     unsigned char    jmp;        /* jmp opcode */
  65.     interrupt void    (*addr)(void);    /* address field */
  66. };
  67.  
  68. #define    RAM_VECTOR(vec, fun) \
  69.         asm("    ifge    (" _imkstr_(vec) "!.$F)-$E"); \
  70.         asm("    fail    Can't modify reset vector"); \
  71.         asm("    endc"); \
  72.         asm("    psect    vectors,ovrld"); \
  73.         asm("    global    _" _imkstr_(fun)); \
  74.         asm("    org    " _imkstr_(vec) "!.$F"); \
  75.         asm("    fdb    999f"); \
  76.         asm("    psect    data,class=CODE"); \
  77.         asm("999:"); \
  78.         asm("    jmp    _" _imkstr_(fun)); \
  79.         asm("    psect    text")
  80.  
  81. extern unsigned char    _Lvectors[];
  82. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)(_Lvectors+((vec)&0x0F)))->addr = fun
  83. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)(_Lvectors+((vec)&0x0F)))->addr)
  84. #endif
  85.  
  86. /*
  87.  *    68HC11, 6801, 6301, 6809 ROM_VECTOR, RAM_VECTOR, CHANGE_VECTOR, etc.
  88.  */
  89.  
  90. #if    m6800 || m6809
  91. #define ROM_VECTOR(vec, fun) \
  92.         asm("    ifge    (" _imkstr_(vec) "!.$3F)-$3E"); \
  93.         asm("    fail    Can't modify reset vector"); \
  94.         asm("    endc"); \
  95.         asm("    psect    vectors,ovrld"); \
  96.         asm("    global    _" _imkstr_(fun)); \
  97.         asm("    org    " _imkstr_(vec) "!.$3F"); \
  98.         asm("    fdb    _" _imkstr_(fun)); \
  99.         asm("    psect    text")
  100.  
  101. struct _RAM_VEC {
  102.     unsigned char    jmp;        /* jmp opcode */
  103.     interrupt void    (*addr)(void);    /* address field */
  104. };
  105.  
  106. #define    RAM_VECTOR(vec, fun) \
  107.         asm("    ifge    (" _imkstr_(vec) "!.$3F)-$3E"); \
  108.         asm("    fail    Can't modify reset vector"); \
  109.         asm("    endc"); \
  110.         asm("    psect    vectors,ovrld"); \
  111.         asm("    global    _" _imkstr_(fun)); \
  112.         asm("    org    " _imkstr_(vec) "!.$3F"); \
  113.         asm("    fdb    999f"); \
  114.         asm("    psect    data,class=DATA"); \
  115.         asm("999:"); \
  116.         asm("    jmp    _" _imkstr_(fun)); \
  117.         asm("    psect    text")
  118.  
  119. extern unsigned char    _Lvectors[];
  120. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)(_Lvectors+((vec)&0x3F)))->addr = fun
  121. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)(_Lvectors+((vec)&0x3F)))->addr)
  122. #endif
  123.  
  124. #if    m6809
  125. /* ei() and di() are for the IRQ, efi() and edi() are for FIRQ */
  126.  
  127. #define    ei()    asm("    andcc    #$EF")
  128. #define    di()    asm("    orcc    #$10")
  129. #define    efi()    asm("    andcc    #$BF")
  130. #define    dfi()    asm("    orcc    #$40")
  131. #endif    /* m6809 */
  132.  
  133. /*
  134.  *    68000 interrupt vector and interrupt handling
  135.  */
  136.  
  137. #if    m68k
  138.  
  139. #define    di()    asm("or.w #$700,sr")
  140. #define    ei()    asm("and.w #$F8FF,sr")
  141.  
  142. #define    ROM_VECTOR(vec, fun) \
  143.         asm("    psect    vectors,ovrld"); \
  144.         asm("    global    _" _imkstr_(fun)); \
  145.         asm("    org    " _imkstr_(vec)); \
  146.         asm("    dc.l    _" _imkstr_(fun)); \
  147.         asm("    psect    text")
  148.  
  149. struct _RAM_VEC {
  150.     unsigned short    jmp;        /* jmp opcode */
  151.     interrupt void    (*addr)(void);    /* address field */
  152. };
  153.  
  154. #define    RAM_VECTOR(vec, fun) \
  155.         asm("    psect    vectors,ovrld"); \
  156.         asm("    global    _" _imkstr_(fun)); \
  157.         asm("    org    " _imkstr_(vec)); \
  158.         asm("    dc.l    999f"); \
  159.         asm("    psect    data,class=DATA"); \
  160.         asm("999:"); \
  161.         asm("    jmp    _" _imkstr_(fun)); \
  162.         asm("    psect    text")
  163.  
  164. extern unsigned char    _Lvectors[];
  165. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)(_Lvectors+(vec)))->addr = fun
  166. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)(_Lvectors+(vec)))->addr)
  167.  
  168. #endif    /* m68k */
  169.  
  170. #if    i8051
  171.  
  172. /*
  173.  *    8051 interrupt vector and interrupt handling
  174.  */
  175.  
  176. #define    ei()    asm("    setb    ea")
  177. #define    di()    asm("    clr    ea")
  178.  
  179. #define    ROM_VECTOR(vec, fun) \
  180.         asm("    global    _" _imkstr_(fun)); \
  181.         asm("    psect    vectors,ovrld"); \
  182.         asm("    org    " _imkstr_(vec)); \
  183.         asm("    ljmp    _" _imkstr_(fun)); \
  184.         asm("    psect    text")
  185.  
  186. #define    RAM_VECTOR(vec, fun) \
  187.         asm("    global    _" _imkstr_(fun)); \
  188.         asm("    psect    vectors,ovrld"); \
  189.         asm("    org    " _imkstr_(vec)); \
  190.         asm("    push    999f+1"); \
  191.         asm("    push    999f"); \
  192.         asm("    ret"); \
  193.         asm("    psect    rdata,class=DATA"); \
  194.         asm("999:"); \
  195.         asm("    dw    _" _imkstr_(fun)); \
  196.         asm("    psect    text");
  197.  
  198. extern near isr * code  _Lvectors[];
  199.  
  200. #define    CHANGE_VECTOR(vec, fun)    (*_Lvectors[(vec)+3] = fun)
  201. #define    READ_RAM_VECTOR(vec)    (*_Lvectors[(vec)+3])
  202.  
  203. #endif    /* i8051 */
  204.  
  205. #ifdef    ROM_VECTOR
  206. #define    set_vector(vec, fun)    ROM_VECTOR(vec, fun)
  207. #endif
  208.  
  209. #if    i8096
  210. #define    ei()    asm("    ei")
  211. #define    di()    asm("    di")
  212. #define    set_vector(vec, fun) \
  213.         asm("    psect    vectors,ovrld"); \
  214.         asm("    global    _" _imkstr_(fun)); \
  215.         asm("    org    " _imkstr_(vec) " and 0x7F"); \
  216.         asm("    dcw    _" _imkstr_(fun)); \
  217.         asm("    psect    text")
  218.  
  219. #endif    /* i8096 */
  220.  
  221. #if    h8300
  222. #define    ei()    asm("    andc    #H'7F,ccr")
  223. #define    di()    asm("    orc    #H'80,ccr")
  224. #define    set_vector(vec, fun) \
  225.         asm("    psect    vectors,ovrld"); \
  226.         asm("    global    _" _imkstr_(fun)); \
  227.         asm("    org    " _imkstr_(vec) " and H'FF"); \
  228.         asm("    dc.w    _" _imkstr_(fun)); \
  229.         asm("    psect    text")
  230.  
  231. #endif    /* h8300 */
  232.  
  233. #if    i8086
  234. #define    ei()    asm("    sti")
  235. #define    di()    asm("    cli")
  236. #endif    /* i8086 */
  237.  
  238. #if    z80
  239. #define    ei()    asm("    ei")
  240. #define    di()    asm("    di")
  241. extern void    im(unsigned char);
  242.  
  243.  
  244. /*
  245.  *    Z80 interrupt mode 2 vector command
  246.  */
  247.  
  248. #define ROM_VECTOR(vec, fun) \
  249.         asm("    psect    im2vecs,class=CODE,ovrld,reloc=256"); \
  250.         asm("    global    _" _imkstr_(fun)); \
  251.         asm("    org    " _imkstr_(vec)); \
  252.         asm("    defw    _" _imkstr_(fun)); \
  253.         asm("    psect    text")
  254.  
  255. struct _RAM_VEC {
  256.     unsigned char    jmp;        /* jmp opcode */
  257.     interrupt void    (*addr)(void);    /* address field */
  258. };
  259.  
  260. #define    RAM_VECTOR(vec, fun) \
  261.         asm("    psect    im2vecs,class=CODE,ovrld,size=256,reloc=256"); \
  262.         asm("    org    " _imkstr_(vec)); \
  263.         asm("    defw    999f"); \
  264.         asm("    psect    data,class=DATA"); \
  265.         asm("999:"); \
  266.         asm("    jp    _" _imkstr_(fun)); \
  267.         asm("    psect    text")
  268.  
  269. extern unsigned char    _Lim2vecs[];
  270. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)(_Lim2vecs+((vec)&0xFF)))->addr = fun
  271. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)(_Lim2vecs+((vec)&0xFF)))->addr)
  272. #endif    z80
  273.  
  274.  
  275. /*    The type of a pointer to an interrupt vector */
  276.  
  277. #if    defined(i8086) && !defined(FLAT_MODEL)
  278.  
  279. extern isr set_vector(volatile far isr *, isr);
  280.  
  281. #if    _HOSTED
  282. extern isr setiva(int, isr);
  283. extern isr getiva(int);
  284. #endif    /* _HOSTED */
  285.  
  286. #else    /* i8086 */
  287.  
  288. #ifndef    set_vector
  289. extern isr set_vector(volatile isr *, isr);
  290. #endif
  291.  
  292. #endif    /* i8086 */
  293.